package veterinaria.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;


import veterinaria.excepcion.DAOExcepcion;
import veterinaria.modelo.Cliente;
import veterinaria.modelo.Especie;
import veterinaria.modelo.Paciente;
import veterinaria.modelo.Persona;
import veterinaria.modelo.Raza;
import veterinaria.util.ConexionBD;

public class ClienteDAO extends BaseDAO {

    public Collection<Cliente> buscarPorNombre(String pEst, String pNom) throws DAOExcepcion {
        String sqlCli="Select a.CliCodigo,a.CliEstado,a.CliRuc,MPersona_Percodigo,b.PerNombre,b.PerDomicilio,b.PerTelefono,b.PerCelular,b.PerCorreo,b.PerImagen From MCliente a, MPersona b Where a.MPersona_PerCodigo=b.PerCodigo And a.CliEstado Like ? And b.PerNombre Like ? And a.CliFlg<>'E' Order By a.CliCodigo";
        Collection<Cliente> lisCli=new ArrayList<Cliente>();
        Connection conCli=null;
        PreparedStatement comCli=null;
        ResultSet cRst=null;
        try {
            conCli=ConexionBD.obtenerConexion();
            comCli=conCli.prepareStatement(sqlCli);
            comCli.setString(1, "%" + pEst + "%");
            comCli.setString(2, "%" + pNom + "%");
            cRst=comCli.executeQuery();
            while (cRst.next()) {
                Cliente cCli=new Cliente();
                Persona cPer=new Persona();
                cPer.setPerCodigo(cRst.getInt("MPersona_PerCodigo"));
                cPer.setPerNombre(cRst.getString("PerNombre"));
                cPer.setPerDomicilio(cRst.getString("PerDomicilio"));
                cPer.setPerTelefono(cRst.getString("PerTelefono"));
                cPer.setPerCelular(cRst.getString("PerCelular"));
                cPer.setPerCelular(cRst.getString("PerCelular"));
                cPer.setPerCorreo(cRst.getString("PerCorreo"));                             
                cPer.setPerImagen(cRst.getString("PerImagen"));                             
                cCli.setCliCodigo(cRst.getInt("CliCodigo"));
                cCli.setCliEstado(cRst.getString("CliEstado"));
                cCli.setCliRuc(cRst.getString("CliRuc"));
                cCli.setPersona(cPer);                                
                lisCli.add(cCli);
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
            
        } finally {
            this.cerrarResultSet(cRst);
            this.cerrarStatement(comCli);
            this.cerrarConexion(conCli);
        }
        System.out.println(lisCli.size());
        return lisCli;
    }

    public Cliente insertar(Cliente pReg) throws DAOExcepcion {
        String cSql = "Insert Into MCliente(CliEstado,CliRuc,CliFlg,MPersona_PerCodigo) Values (?,?,?,?)";
        Connection cCon = null;
        PreparedStatement cCom = null;
        ResultSet cRst = null;
        try {
            cCon = ConexionBD.obtenerConexion();
            cCom = cCon.prepareStatement(cSql);
            cCom.setString(1, pReg.getCliEstado());
            cCom.setString(2, pReg.getCliRuc());
            cCom.setString(3, "A");
            cCom.setInt(4, pReg.getPersona().getPerCodigo());           
            int nroErr = cCom.executeUpdate();
            if (nroErr != 1) {
                throw new SQLException("No se pudo insertar");
            }
            int newCod = 0;
            cSql="Select Last_Insert_id()";
            cCom=cCon.prepareStatement(cSql);
            cRst=cCom.executeQuery();
            if (cRst.next()) {
                newCod=cRst.getInt(1);
            }
            pReg.setCliCodigo(newCod);
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(cRst);
            this.cerrarStatement(cCom);
            this.cerrarConexion(cCon);
        }
        return pReg;
    }

    public Cliente obtener(int pCod) throws DAOExcepcion {
        Cliente cReg = new Cliente();
        Connection cCon = null;
        PreparedStatement cCom = null;
        ResultSet cRst = null;
        try {
            String query = "Select CliCodigo, CliEstado, Cliruc From MCliente Where CliCodigo=? And CliFlg<>'E'";
            cCon=ConexionBD.obtenerConexion();
            cCom=cCon.prepareStatement(query);
            cCom.setInt(1, pCod);
            cRst=cCom.executeQuery();
            if (cRst.next()) {
                cReg.setCliCodigo(cRst.getInt(1));
                cReg.setCliEstado(cRst.getString(2));
                cReg.setCliRuc(cRst.getString(3));
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(cRst);
            this.cerrarStatement(cCom);
            this.cerrarConexion(cCon);
        }
        return cReg;
    }

    public void eliminar(int pCod) throws DAOExcepcion {
        String cSql="UpDate MCliente Set CliFlg=? Where CliCodigo=? And CliFlg<>'E'";
        Connection cCon=null;
        PreparedStatement cCom=null;
        try {
            cCon=ConexionBD.obtenerConexion();
            cCom=cCon.prepareStatement(cSql);
            cCom.setString(1, "E");
            cCom.setInt(2, pCod);
            int i = cCom.executeUpdate();
            if (i != 1) {
                throw new SQLException("No se pudo eliminar");
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarStatement(cCom);
            this.cerrarConexion(cCon);
        }
    }

    public Cliente actualizar(Cliente pReg) throws DAOExcepcion {
        String cSql="UpDate MCliente Set CliEstado=?,CliRuc=?,CliFlg=?,MPersona_PerCodigo=? Where CliCodigo=?";
        Connection cCon=null;
        PreparedStatement cCom=null;
        try {
            cCon=ConexionBD.obtenerConexion();
            cCom=cCon.prepareStatement(cSql);
            cCom.setString(1, pReg.getCliEstado());
            cCom.setString(2, pReg.getCliRuc());
            cCom.setString(3, "M");
            cCom.setInt(4, pReg.getPersona().getPerCodigo());
            cCom.setInt(5, pReg.getCliCodigo());            
            int i = cCom.executeUpdate();
            if (i != 1) {
                throw new SQLException("No se pudo actualizar");
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarStatement(cCom);
            this.cerrarConexion(cCon);
        }
        return pReg;
    }

    public Collection<Cliente> listar() throws DAOExcepcion {
        Collection<Cliente> c = new ArrayList<Cliente>();
        Connection cCon=null;
        PreparedStatement cCom=null;
        ResultSet cRst=null;
        try {
            cCon = ConexionBD.obtenerConexion();
            String cSql="Select a.CliCodigo,a.CliEstado,a.CliRuc,MPersona_Percodigo,b.PerNombre,b.PerDomicilio,b.PerTelefono,b.PerCelular,b.PerCorreo,b.PerImagen From MCliente a, MPersona b Where a.MPersona_PerCodigo=b.PerCodigo And a.CliFlg<>'E' Order By a.CliCodigo";
            cCom=cCon.prepareStatement(cSql);
            cRst=cCom.executeQuery();
            while (cRst.next()) {
                Cliente cCli=new Cliente();
                Persona cPer=new Persona();
                cPer.setPerCodigo(cRst.getInt("MPersona_PerCodigo"));
                cPer.setPerNombre(cRst.getString("PerNombre"));
				cPer.setPerDomicilio(cRst.getString("PerDomicilio"));
				cPer.setPerTelefono(cRst.getString("PerTelefono"));
				cPer.setPerCelular(cRst.getString("PerCelular"));
				cPer.setPerCelular(cRst.getString("PerCorreo"));
				cPer.setPerImagen(cRst.getString("PerImagen"));				                
                cCli.setCliCodigo(cRst.getInt("CliCodigo"));
                cCli.setCliEstado(cRst.getString("CliEstado"));
                cCli.setCliRuc(cRst.getString("CliRuc"));
                cCli.setPersona(cPer);                
                c.add(cCli);
            }

        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(cRst);
            this.cerrarStatement(cCom);
            this.cerrarConexion(cCon);
        }
        return c;
    }

    public Collection<Paciente> paciente(int pCli) throws DAOExcepcion {
        Collection<Paciente> c = new ArrayList<Paciente>();
        Connection cCon=null;
        PreparedStatement cCom=null;
        ResultSet cRst=null;
        try {
            cCon = ConexionBD.obtenerConexion();
            String cSql="Select a.PacCodigo,a.PacNombre,a.PacGenero,a.PacTSangre,a.PacEsterilizado,a.PacTamano,a.PacActividad,a.PacPeso,a.PacFNacimiento,a.PacNotas,a.PacCondicion,a.PacImagen,a.MEspecie_EspCodigo,a.MRaza_RazCodigo,a.MCliente_CliCodigo,b.EspNombre,c.RazNombre,d.CliEstado,d.CliRuc,d.MPersona_PerCodigo,e.PerNombre,e.PerDomicilio,e.PerTelefono,e.PerCelular,e.PerImagen From MPaciente a, MEspecie b, MRaza c, MCliente d, MPersona e Where a.MEspecie_EspCodigo=b.EspCodigo And a.MRaza_RazCodigo=c.RazCodigo And a.MCliente_CliCodigo=d.CliCodigo And d.MPersona_PerCodigo=e.PerCodigo And a.MCliente_CliCodigo=?";
            cCom=cCon.prepareStatement(cSql);
            cCom.setInt(1, pCli);            
            cRst=cCom.executeQuery();            
            while (cRst.next()) {
                Paciente cPac = new Paciente();
                Especie cEsp=new Especie();
                Raza cRaz=new Raza();
                Cliente cCli=new Cliente();
                Persona cPer=new Persona();
                cEsp.setEspCodigo(cRst.getInt("MEspecie_EspCodigo"));
                cEsp.setEspNombre(cRst.getString("EspNombre"));                
                cRaz.setRazCodigo(cRst.getInt("MRaza_RazCodigo"));
                cRaz.setRazNombre(cRst.getString("RazNombre"));
                cCli.setCliCodigo(cRst.getInt("MCliente_CliCodigo"));    
                cCli.setCliEstado(cRst.getString("Cliestado"));    
                cCli.setCliRuc(cRst.getString("CliRuc"));
                cPer.setPerCodigo(cRst.getInt("MPersona_PerCodigo"));
                cPer.setPerNombre(cRst.getString("PerNombre"));
                cPer.setPerDomicilio(cRst.getString("PerDomicilio"));
                cPer.setPerTelefono(cRst.getString("PerTelefono"));
                cPer.setPerCelular(cRst.getString("PerCelular"));
                cPer.setPerImagen(cRst.getString("PerImagen"));                
                cPac.setPacCodigo(cRst.getInt("PacCodigo"));
                cPac.setPacNombre(cRst.getString("PacNombre"));
                cPac.setPacGenero(cRst.getString("PacGenero"));
                cPac.setPacTSangre(cRst.getString("PacTSangre"));                
                cPac.setPacEsterilizado(cRst.getString("PacEsterilizado"));
                cPac.setPacTamano(cRst.getString("PacTamano"));
                cPac.setPacActividad(cRst.getString("PacActividad"));
                cPac.setPacPeso(cRst.getDouble("PacPeso"));
                cPac.setPacFNacimiento(cRst.getString("PacFNacimiento"));
                cPac.setPacCondicion(cRst.getString("PacCondicion"));
                cPac.setPacImagen(cRst.getString("PacImagen"));                
                cCli.setPersona(cPer);
                cPac.setEspecie(cEsp);
                cPac.setRaza(cRaz);
                cPac.setCliente(cCli);
                c.add(cPac);
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(cRst);
            this.cerrarStatement(cCom);
            this.cerrarConexion(cCon);
        }
        return c;
    }
}
